#include <iostream>
#include <signal.h>
#include <unistd.h>
#include <cassert>
using namespace std;

void showPending(sigset_t *pending)
{
    for (int sig = 1; sig <= 31; sig++)
    {
        // 判断从1到32的信号是否在集合里，是就显示1，不是就显示0
        if (sigismember(pending, sig))
            cout << "1";
        else
            cout << "0";
    }
    cout << endl;
}
void handler(int signum)
{
    cout << "走到这意味着触发2号信号的处理函数" << endl;
    cout << "获取了一个信号" << signum << endl;
    cout << "获取了一个信号" << signum << endl;
    cout << "获取了一个信号" << signum << endl;
    sigset_t pending;
    int c = 10;
    while (true)
    {
        // 获取pending信号集
        sigpending(&pending);
        showPending(&pending);
        c--;
        if (!c)
            break;
        sleep(1);
    }
}
int main()
{
    // signal(2, SIG_IGN);//将2号信号忽略
    //  用os提供的(内核数据类型)类型定义两个结构体变量
    //  定义出来的变量在用户栈上
    struct sigaction act, oact;
    act.sa_flags = 0;
    sigemptyset(&act.sa_mask);
    // 自定义信号处理函数
    act.sa_handler = handler;
    // 注册2号信号处理函数，以结构体设置的自定义信号处理方式来设置2号信号的信号处理方式，
    // 当发送2号信号时触发信号处理函数
    sigaction(2, &act, &oact);
    // 尝试打印默认的信号处理
    cout << "default action is:" << (int)(oact.sa_handler) << endl;
    while (true)
        sleep(1);
    return 0;
}